//The contents of this file are subject to the Mozilla Public License Version 1.1
//(the "License"); you may not use this file except in compliance with the
//License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
//
//Software distributed under the License is distributed on an "AS IS" basis,
//WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
//for the specific language governing rights and
//limitations under the License.
//
//The Original Code is "The Columba Project"
//
//The Initial Developers of the Original Code are Frederik Dietz and Timo Stich.
//Portions created by Frederik Dietz and Timo Stich are Copyright (C) 2003.
//
//All Rights Reserved.
package org.columba.mail.gui.config.general;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.Enumeration;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.KeyStroke;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;

import org.columba.api.plugin.IExtension;
import org.columba.api.plugin.IExtensionHandler;
import org.columba.api.plugin.IExtensionHandlerKeys;
import org.columba.api.plugin.PluginHandlerNotFoundException;
import org.columba.core.gui.base.ButtonWithMnemonic;
import org.columba.core.gui.base.CheckBoxWithMnemonic;
import org.columba.core.gui.base.LabelWithMnemonic;
import org.columba.core.gui.base.SingleSideEtchedBorder;
import org.columba.core.gui.util.DialogHeaderPanel;
import org.columba.core.help.HelpManager;
import org.columba.core.plugin.PluginManager;
import org.columba.mail.config.ComposerItem;
import org.columba.mail.config.MailConfig;
import org.columba.mail.config.OptionsItem;
import org.columba.mail.util.MailResourceLoader;

import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;

/**
 * Mail General Options Dialog
 *
 * @author fdietz
 */
public class MailOptionsDialog extends JDialog implements ActionListener {
	protected JButton okButton;

	protected JButton cancelButton;

	protected JButton helpButton;

	protected CheckBoxWithMnemonic markCheckBox;

	protected JSpinner markSpinner;

	protected CheckBoxWithMnemonic preferHtmlCheckBox;

	protected CheckBoxWithMnemonic disableHtmlCheckBox;

	protected CheckBoxWithMnemonic enableSmiliesCheckBox;

	protected CheckBoxWithMnemonic quotedColorCheckBox;

	protected JButton quotedColorButton;

	protected JCheckBox emptyTrashCheckBox;

	protected CheckBoxWithMnemonic emptySubjectCheckBox;

	protected CheckBoxWithMnemonic sendHtmlMultipartCheckBox;

	protected CheckBoxWithMnemonic showAttachmentsInlineCheckBox;

	private JLabel selectedBrowserLabel;

	protected JComboBox selectedBrowserComboBox;

	protected LabelWithMnemonic forwardLabel;

	protected JComboBox forwardComboBox;

	public MailOptionsDialog(JFrame frame) {
		super(frame, MailResourceLoader.getString("dialog", "general",
				"dialog_title"), true);

		initComponents();

		layoutComponents();

		updateComponents(true);

		pack();
		setLocationRelativeTo(null);
		setVisible(true);
	}

	public void updateComponents(boolean b) {
		OptionsItem optionsItem = MailConfig.getInstance().getOptionsItem();
		ComposerItem composerItem = MailConfig.getInstance().getComposerItem();

		if (b) {

			showAttachmentsInlineCheckBox.setSelected(optionsItem
					.getBooleanWithDefault(OptionsItem.MESSAGEVIEWER,
							OptionsItem.INLINE_ATTACHMENTS_BOOL, false));

			selectedBrowserComboBox.setSelectedItem(optionsItem
					.getStringWithDefault(OptionsItem.MESSAGEVIEWER,
							OptionsItem.SELECTED_BROWSER, "Default"));

			int delay = optionsItem.getIntegerWithDefault(
					OptionsItem.MARKASREAD, OptionsItem.DELAY_INT, 2);
			boolean enable = optionsItem.getBooleanWithDefault(
					OptionsItem.MARKASREAD, OptionsItem.ENABLED_BOOL, true);

			markCheckBox.setSelected(enable);
			markSpinner.setValue(new Integer(delay));

			boolean enableSmilies = optionsItem.getBooleanWithDefault(
					OptionsItem.MESSAGEVIEWER_SMILIES,
					OptionsItem.ENABLED_BOOL, true);

			enableSmiliesCheckBox.setSelected(enableSmilies);

			boolean preferHtml = optionsItem.getBooleanWithDefault(
					OptionsItem.HTML, OptionsItem.PREFER_BOOL, true);

			preferHtmlCheckBox.setSelected(preferHtml);

			boolean disablehtml = optionsItem.getBooleanWithDefault(
					OptionsItem.HTML, OptionsItem.DISABLE_BOOL, true);

			disableHtmlCheckBox.setSelected(disablehtml);

			boolean askSubject = composerItem.getBooleanWithDefault(
					ComposerItem.SUBJECT, ComposerItem.ASK_IF_EMPTY_BOOL, true);

			emptySubjectCheckBox.setSelected(askSubject);

			boolean sendHtml = composerItem.getBooleanWithDefault(
					ComposerItem.HTML, ComposerItem.SEND_AS_MULTIPART, true);

			sendHtmlMultipartCheckBox.setSelected(sendHtml);

			int forwardStyle = composerItem.getIntegerWithDefault(
					ComposerItem.FORWARD, ComposerItem.STYLE, 0);

			forwardComboBox.setSelectedIndex(forwardStyle);

		} else {

			optionsItem.setInteger(OptionsItem.MARKASREAD,
					OptionsItem.DELAY_INT, ((Integer) markSpinner.getValue())
							.intValue());

			optionsItem.setBoolean(OptionsItem.MARKASREAD,
					OptionsItem.ENABLED_BOOL, markCheckBox.isSelected());

			// notify configuration changes listeners
			// @see org.columba.mail.gui.table.util.MarkAsReadTimer
			optionsItem.notifyObservers(OptionsItem.MARKASREAD);

			optionsItem.setBoolean(OptionsItem.MESSAGEVIEWER_SMILIES,
					OptionsItem.ENABLED_BOOL, enableSmiliesCheckBox
							.isSelected());

			optionsItem.setBoolean(OptionsItem.MESSAGEVIEWER,
					OptionsItem.INLINE_ATTACHMENTS_BOOL,
					showAttachmentsInlineCheckBox.isSelected());

			optionsItem.setString(OptionsItem.MESSAGEVIEWER,
					OptionsItem.SELECTED_BROWSER,
					(String) selectedBrowserComboBox.getSelectedItem());

			// notify configuration changes listeners
			// @see org.columba.mail.gui.message.TextViewer
			optionsItem.notifyObservers(OptionsItem.SELECTED_BROWSER);

			// send notification event
			// @see org.columba.mail.gui.message.TextViewer
			optionsItem.notifyObservers(OptionsItem.MESSAGEVIEWER_SMILIES);

			optionsItem.setBoolean(OptionsItem.HTML, OptionsItem.PREFER_BOOL,
					preferHtmlCheckBox.isSelected());

			optionsItem.setBoolean(OptionsItem.HTML, OptionsItem.DISABLE_BOOL,
					disableHtmlCheckBox.isSelected());

			composerItem.setBoolean(ComposerItem.SUBJECT,
					ComposerItem.ASK_IF_EMPTY_BOOL, emptySubjectCheckBox
							.isSelected());

			// notify listeners
			// @see org.columba.mail.gui.composer.SubjectController
			composerItem.notifyObservers(ComposerItem.SUBJECT);

			composerItem.setBoolean(ComposerItem.HTML,
					ComposerItem.SEND_AS_MULTIPART, sendHtmlMultipartCheckBox
							.isSelected());
			// notify listeners
			composerItem.notifyObservers(ComposerItem.HTML);

			composerItem.setInteger(ComposerItem.FORWARD, ComposerItem.STYLE,
					forwardComboBox.getSelectedIndex());

			// notify listeners
			// @see org.columba.mail.gui.table.action.ForwardAction
			composerItem.notifyObservers(ComposerItem.FORWARD);

		}
	}

	protected void initComponents() {
		// general
		markCheckBox = new CheckBoxWithMnemonic(MailResourceLoader.getString(
				"dialog", "general", "mark_messages_read"));

		markSpinner = new JSpinner();
		markSpinner.setModel(new SpinnerNumberModel(1, 0, 99, 1));

		emptyTrashCheckBox = new CheckBoxWithMnemonic(MailResourceLoader
				.getString("dialog", "general", "empty_trash"));
		emptyTrashCheckBox.setEnabled(false);

		enableSmiliesCheckBox = new CheckBoxWithMnemonic(MailResourceLoader
				.getString("dialog", "general", "enable_smilies"));

		quotedColorCheckBox = new CheckBoxWithMnemonic(MailResourceLoader
				.getString("dialog", "general", "color_quoted_text"));
		quotedColorButton = new JButton("...");
		quotedColorButton.setActionCommand("COLOR");
		quotedColorButton.addActionListener(this);

		preferHtmlCheckBox = new CheckBoxWithMnemonic(MailResourceLoader
				.getString("dialog", "general", "prefer_html"));
		disableHtmlCheckBox = new CheckBoxWithMnemonic(MailResourceLoader
				.getString("dialog", "general", "disable_html"));
		// composer
		emptySubjectCheckBox = new CheckBoxWithMnemonic(MailResourceLoader
				.getString("dialog", "general", "ask_on_empty_subject"));

		sendHtmlMultipartCheckBox = new CheckBoxWithMnemonic(MailResourceLoader
				.getString("dialog", "general", "send_html_multipart"));

		forwardLabel = new LabelWithMnemonic(MailResourceLoader.getString(
				"dialog", "general", "forward_as"));

		String[] items = {
				MailResourceLoader.getString("dialog", "general",
						"forward_as_attachment"),
				MailResourceLoader.getString("dialog", "general",
						"forward_as_quoted") };

		forwardComboBox = new JComboBox(items);

		showAttachmentsInlineCheckBox = new CheckBoxWithMnemonic(
				"Show Attachments &Inline");
		showAttachmentsInlineCheckBox.setActionCommand("ATTACHMENTS_INLINE");
		showAttachmentsInlineCheckBox.addActionListener(this);

		selectedBrowserLabel = new JLabel("Message Renderer");
		Vector<String> v = new Vector<String>();
		try {
			IExtensionHandler handler = PluginManager.getInstance().getExtensionHandler(IExtensionHandlerKeys.ORG_COLUMBA_CORE_HTMLVIEWER);
			Enumeration e = handler.getExtensionEnumeration();
			while (e.hasMoreElements()) {
				IExtension ext = (IExtension) e.nextElement();
				String id = ext.getMetadata().getId();
				v.add(id);
			}
		} catch (PluginHandlerNotFoundException e) {
			e.printStackTrace();
		}
		selectedBrowserComboBox = new JComboBox(v.toArray(new String[0]));
		selectedBrowserComboBox.setSelectedIndex(0);
		selectedBrowserComboBox.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				if ( selectedBrowserComboBox.getSelectedIndex() != 0)
					JOptionPane
					.showMessageDialog(MailOptionsDialog.this,
							"This is an experimental feature and therefore requires a restart of Columba");
			}});

		// button panel
		okButton = new ButtonWithMnemonic(MailResourceLoader.getString(
				"global", "ok"));
		okButton.setActionCommand("OK");
		okButton.addActionListener(this);

		cancelButton = new ButtonWithMnemonic(MailResourceLoader.getString(
				"global", "cancel"));
		cancelButton.setActionCommand("CANCEL");
		cancelButton.addActionListener(this);

		helpButton = new ButtonWithMnemonic(MailResourceLoader.getString(
				"global", "help"));

		// associate with JavaHelp
		HelpManager.getInstance().enableHelpOnButton(helpButton,
				"configuring_columba_7");
		HelpManager.getInstance().enableHelpKey(getRootPane(),
				"configuring_columba_7");
	}

	protected void layoutComponents() {
		JPanel contentPane = new JPanel();
		setContentPane(contentPane);
		contentPane.setLayout(new BorderLayout());

		// Create a FormLayout instance.
		FormLayout layout = new FormLayout(
				"12dlu, default, 3dlu, max(10dlu;default), 3dlu, default",

				// 3 columns
				""); // rows are added dynamically (no need to define them here)

		// create a form builder
		DefaultFormBuilder builder = new DefaultFormBuilder(layout);

		// create EmptyBorder between components and dialog-frame
		builder.setDefaultDialogBorder();

		// skip the first column
		builder.setLeadingColumnOffset(1);

		// Add components to the panel:
		builder.appendSeparator(MailResourceLoader.getString("dialog",
				"general", "general"));
		builder.nextLine();

		builder.append(preferHtmlCheckBox, 4);
		builder.nextLine();
		builder.append(disableHtmlCheckBox, 4);
		builder.nextLine();
		builder.append(enableSmiliesCheckBox, 4);
		builder.nextLine();
//		builder.append(showAttachmentsInlineCheckBox, 4);
//		builder.nextLine();




		// its maybe better to leave this option out of the dialog
		// -> make it configurable in the xml file anyway
		/*
		 * builder.append(quotedColorCheckBox, quotedColorButton);
		 * builder.nextLine();
		 */
		builder.append(markCheckBox, markSpinner);
		builder.nextLine();
		builder.append(selectedBrowserLabel, selectedBrowserComboBox);
		builder.nextLine();

		//builder.nextLine();

		builder.appendSeparator(MailResourceLoader.getString("dialog",
				"general", "composing_messages"));
		builder.nextLine();

		builder.append(emptySubjectCheckBox, 4);
		builder.nextLine();

		builder.append(sendHtmlMultipartCheckBox, 4);
		builder.nextLine();

		builder.append(forwardLabel, forwardComboBox);
		builder.nextLine();

		//layout.setRowGroups(new int[][]{ {1, 3, 5, 7, 9, 11, 13, 15} });
		/*
		 * builder.append(spellLabel, spellButton); builder.nextLine();
		 */
		contentPane.add(builder.getPanel(), BorderLayout.CENTER);

		// init bottom panel with OK, Cancel buttons
		JPanel bottomPanel = new JPanel(new BorderLayout(0, 0));
		bottomPanel.setBorder(new SingleSideEtchedBorder(SwingConstants.TOP));

		JPanel buttonPanel = new JPanel(new GridLayout(1, 3, 6, 0));
		buttonPanel.setBorder(BorderFactory.createEmptyBorder(12, 12, 12, 12));

		buttonPanel.add(okButton);

		buttonPanel.add(cancelButton);
		buttonPanel.add(helpButton);

		bottomPanel.add(buttonPanel, BorderLayout.EAST);
		contentPane.add(bottomPanel, BorderLayout.SOUTH);

		getRootPane().setDefaultButton(okButton);
		getRootPane().registerKeyboardAction(this, "CANCEL",
				KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
				JComponent.WHEN_IN_FOCUSED_WINDOW);

		contentPane.add(new DialogHeaderPanel("Mail Options", "Change email-specific options"), BorderLayout.NORTH);

	}

	public void actionPerformed(ActionEvent event) {
		String action = event.getActionCommand();

		if (action.equals("OK")) {
			setVisible(false);

			updateComponents(false);
		} else if (action.equals("CANCEL")) {
			setVisible(false);
		} else if (action.equals("COLOR")) {
			//Set up color chooser for setting quoted color
			Color newColor = JColorChooser.showDialog(this, MailResourceLoader
					.getString("dialog", "general", "choose_text_color"), null);

			if (newColor != null) {
				quotedColorButton.setBackground(newColor);
			}
		}
	}
}